package com.sh.单例模式.双检锁;



/**
 * 双检锁单例模式
 * @author sh
 *
 * 1、使用 volatile 关键字修饰 instance 变量，禁止指令重排  保证变量可见性
 * 2、使用 synchronized 关键字修饰 getInstance() 方法，保证方法同步
 * 3、再在同步代码块中双重检查，保证只创建一次对象
 * 缺点：每次调用 getInstance() 方法都要同步，效率较低
 * 优点：延迟加载 、线程安全
 */
public class Main {
    public static void main(String[] args) {
        DoubleCheckedLockingSingleton s1 = DoubleCheckedLockingSingleton.getInstance();
        DoubleCheckedLockingSingleton s2 = DoubleCheckedLockingSingleton.getInstance();

        if (s1 == s2) {
            System.out.println("两个对象是同一个实例。");
        } else {
            System.out.println("两个对象不是同一个实例。");
        }
    }
}